[レポート]カーネル空間への宝探し:Linuxカーネルでの攻撃可能な構造体の探索 – CODE BLUE 2023 #codeblue_jp
こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
今回はCODE BLUE 2023で行われた以下のセッションのレポートです。
カーネル空間への宝探し:Linuxカーネルでの攻撃可能な構造体の探索
ヒープバッファオーバーフローやUse-after-Freeといったヒープに関する脆弱性は、もっとも発生しやすく重大な脆弱性の1つである。特にカーネル空間では、すべてのドライバとカーネル本体がヒープ領域を共有しているため、これらのバグは重大な影響を及ぼすことが多い。ヒープ関連のバグを攻撃に利用するためには、該当する構造体が確保されるサイズが重要になる。しかし、大規模なソフトウェアやソースコードのないバイナリにおいて、確保されるサイズごとに攻撃に適した構造体を見つけることは容易ではない。
研究者はこれまで、静的解析と動的解析の両方のアプローチでこの問題に取り組んできた。しかし、アロケーションを正確に追うことができなかったり、ソースコードに依存してしまったり、いずれの手法にも問題点があった。さらに、これまでの研究では、攻撃者が実際にその構造体のメモリ確保を制御できるのかという問題にはあまり着目されなかった。
これらの問題を解決するため、本研究ではMALTIES(Malloc Tracker for Identifying Exploitable Structures)という手法を提案する。MALTIESはGhidraスクリプトとして書かれているため、ソースコードのないバイナリにも適用可能である。提案手法では、すべての動的なメモリ確保を静的解析で検出し、CFG(Control Flow Graph)を辿ることで各メモリ確保に到達可能なすべてのパスを探索する。これにより、発見したメモリ確保が実際に攻撃に利用できるかまでを判断する。
本研究ではLinuxカーネルを対象とし、kmallocのキャッシュサイズに応じて利用できる構造体を探索した。その結果、MALTIESはkmallocのすべてのサイズ帯で利用できる構造体を発見することに成功した。Presented by : 藤原 裕大 - Yudai Fujiwara
レポート
- 今日話すこと
- ヒープ関連の脆弱性について話す
- そういう脆弱性を攻撃に使う場合の課題や壁などについて話す
- バグだけではそのものの脆弱性ではない
- 脆弱性 = バグ + 役に立つ構造体
- MALTIESというアプローチ
- Malloc Tracker for Identifing Exproitable Structures
- 藤原氏が考案、命名はChatGPT
- カーネルにもプログラムにも使える
- 背景とモチベーション
- カーネにおけるヒープ
- データをドライブやカーネルに格納するためのストア
- 一般的に同じヒープが共有利用される
- カーネにおけるヒープ
- Heap Buffer Overflow
- Use-after-Free
- SLUB
- Linuxカーネルで使われるヒープマネージャー
- アロケートのサイズごとに異なるページフレームを利用する
- エクスプロイトフレンドリーな構造体とは
- ユーザー領域からの割り当てをコントロール出来る
- エクスプロイトもしくはコントロール可能なメンバー
- 関数ポインターやBlobデータなど
- よく知られているエクスプロイトフレンドリーな構造体
- seq_operations
- tty_struct
- setxattr
- msg_msg
- 関連するWorks
- Dynamic analysis
- Static analysis
- 構造体の正確なサイズを知ることなど、4つの課題がある
- Size Accuracy
- Coverage accuracy
- Allocatability check
- Exploitability check
- MALTIES
- 動的手法や静的手法に比べ、概ねどれも優れている
- しかし、Allocatabilityなど動的手法の方が優れているものもある
- MALTIESはGhidraスクリプトとして書かれる
- なぜGhidraを選んだのか?
- OSSだから
- 静的解析に非常に有利
- OSSなので常に改善が加えられている。コミュニティが活発
- デコンパイル性能が優秀
- トラバースが非常にシンプル
- デモコードを参考にアルゴリズムを解説
- 結果を評価
- 検証時の最新linuxカーネルを対象
- 1133の構造体を見つけることが出来た
- kmem_cacheを除く
- 藤原氏のPCでおよそ5分で結果が出た
- 構造体例1:kmalloc-8
- 構造体例2:kmalloc-256
- shmid_kernel
- 構造体例3:variable size
- sem_array
- sem_permが関数ポインターが含まれている
- sem_array
- 将来的な課題
- Indirect branches
- 利用するリバースエンジニアリングフレームワークの精度に左右される
- Variable sizes
- Indirect branches
- 結論
- この研究を通じてMALTIESを開発
- 1000以上の攻撃に有用な構造体を発見
- 最後に
- ヒープ関連の脆弱性は構造体が無いと意味が無い
- Ghidraスクリプトフレームワークは非常に強力
感想
Linuxカーネルのヒープ関連では、バグだけでなくエクスプロイトフレンドリーな構造体が必要があって初めて脆弱性と呼べるんですね。
藤原氏はCTFで役に立つということもあり、このMALTIESというスクリプトの開発に踏み切ったそうです。
自分自身あまりこの分野に明るくないこともあり、英語のセッションの全て聞き取ることは出来ませんでした。後でセッションのスライドやMALTIESのgithubリポジトリが公開されるとのことなので、改めて内容を確認しようと思います。